package cn.silver.module.system.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.silver.framework.core.constant.CacheNames;
import cn.silver.framework.core.enums.SystemStatusEnums;
import cn.silver.framework.core.exception.ServiceException;
import cn.silver.framework.core.utils.StringUtils;
import cn.silver.framework.mybatis.helper.DataBaseHelper;
import cn.silver.framework.mybatis.service.impl.TreeServiceImpl;
import cn.silver.framework.satoken.utils.LoginHelper;
import cn.silver.module.system.bean.DeptBean;
import cn.silver.module.system.domain.SysDept;
import cn.silver.module.system.mapper.SysDeptMapper;
import cn.silver.module.system.param.DeptParam;
import cn.silver.module.system.service.DeptService;
import cn.silver.module.system.service.ISysDeptService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 部门管理 服务实现
 *
 * @author Silver Zhou
 */
@Service
@RequiredArgsConstructor
public class SysDeptServiceImpl extends TreeServiceImpl<SysDeptMapper, SysDept, DeptParam, DeptBean> implements ISysDeptService, DeptService {



    /**
     * 通过部门ID查询部门名称
     *
     * @param deptIds 部门ID串逗号分隔
     * @return 部门名称串逗号分隔
     */
    @Override
    public String selectDeptNameByIds(String deptIds) {
        List<DeptBean> list = this.baseMapper.selectVoBatchIds(StringUtils.splitTo(deptIds, Convert::toStr));
        if (CollUtil.isNotEmpty(list)) {
            return list.stream().map(DeptBean::getName).collect(Collectors.joining(StringUtils.SEPARATOR));
        } else {
            return null;
        }
    }

    /**
     * 根据ID查询所有子部门数（正常状态）
     *
     * @param deptId 部门ID
     * @return 子部门数
     */
    @Override
    public long selectNormalChildrenDeptById(String deptId) {
        return baseMapper.selectCount(new LambdaQueryWrapper<SysDept>()
                .eq(SysDept::getStatus, SystemStatusEnums.NORMAL.getCode())
                .apply(DataBaseHelper.findInSet(deptId, "ancestors")));
    }

//    /**
//     * 是否存在子节点
//     *
//     * @param deptId 部门ID
//     * @return 结果
//     */
//    @Override
//    public boolean hasChildByDeptId(String deptId) {
//        return baseMapper.exists(new LambdaQueryWrapper<SysDept>()
//                .eq(SysDept::getPid, deptId));
//    }

    /**
     * 查询部门是否存在用户
     *
     * @param deptId 部门ID
     * @return 结果 true 存在 false 不存在
     */
    @Override
    public boolean checkDeptExistUser(String deptId) {
        //TODO
//        return userMapper.exists(new LambdaQueryWrapper<>());
        return false;
    }
    /**
     * 校验部门是否有数据权限
     *
     * @param deptId 部门id
     */
    @Override
    public void checkDeptDataScope(String deptId) {
        if (ObjectUtil.isNull(deptId)) {
            return;
        }
        if (LoginHelper.isSuperAdmin()) {
            return;
        }
        DeptBean dept = baseMapper.selectVoById(deptId);
        if (ObjectUtil.isNull(dept)) {
            throw new ServiceException("没有权限访问部门数据！");
        }
    }

    /**
     * 新增保存部门信息
     *
     * @param model 部门信息
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public boolean insert(DeptBean model) {
//        if (!this.checkDeptNameUnique(model)) {
//            throw new ServiceException("新增部门'" + model.getName() + "'失败，部门名称已存在");
//        }
//        SysDept info = baseMapper.selectById(model.getPid());
//        // 如果父节点不为正常状态,则不允许新增子节点
//        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
//            throw new ServiceException("部门停用，不允许新增");
//        }
//        SysDept dept = MapstructUtils.convert(model, SysDept.class);
////		dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getPid());
//        return SqlHelper.retBool(baseMapper.insert(dept));
        return super.insert(model);
    }

    /**
     * 修改保存部门信息
     *
     * @param model 部门信息
     * @return 结果
     */
    @Override
    @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#model.id")
    public boolean update(DeptBean model) {
//        String deptId = model.getId();
//        this.checkDeptDataScope(deptId);
//        if (!this.checkDeptNameUnique(model)) {
//            throw new ServiceException("修改部门'" + model.getName() + "'失败，部门名称已存在");
//        } else if (model.getPid().equals(deptId)) {
//            throw new ServiceException("修改部门'" + model.getName() + "'失败，上级部门不能是自己");
//        } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, model.getStatus())) {
//            if (this.selectNormalChildrenDeptById(deptId) > 0) {
//                throw new ServiceException("该部门包含未停用的子部门!");
//            } else if (this.checkDeptExistUser(deptId)) {
//                throw new ServiceException("该部门下存在已分配用户，不能禁用!");
//            }
//        }
//        SysDept dept = MapstructUtils.convert(model, SysDept.class);
//        SysDept oldDept = baseMapper.selectById(dept.getId());
//        if (!oldDept.getPid().equals(dept.getPid())) {
//            // 如果是新父部门 则校验是否具有新父部门权限 避免越权
//            this.checkDeptDataScope(dept.getPid());
//            SysDept newParentDept = baseMapper.selectById(dept.getPid());
//            if (ObjectUtil.isNotNull(newParentDept) && ObjectUtil.isNotNull(oldDept)) {
////				String newAncestors = newParentDept.getAncestors() + StringUtils.SEPARATOR + newParentDept.getId();
////				String oldAncestors = oldDept.getAncestors();
////				dept.setAncestors(newAncestors);
////				updateDeptChildren(dept.getId(), newAncestors, oldAncestors);
//            }
//        }
////		if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors())
////				&& !StringUtils.equals(UserConstants.DEPT_NORMAL, dept.getAncestors())) {
////			// 如果该部门是启用状态，则启用该部门的所有上级部门
////			updateParentDeptStatusNormal(dept);
////		}
//        return SqlHelper.retBool(baseMapper.updateById(dept));
        return super.update(model);
    }

    /**
     * 修改子元素关系
     *
     * @param deptId       被修改的部门ID
     * @param newAncestors 新的父ID集合
     * @param oldAncestors 旧的父ID集合
     */
//    private void updateDeptChildren(String deptId, String newAncestors, String oldAncestors) {
//        List<SysDept> children = baseMapper.selectList(new LambdaQueryWrapper<SysDept>()
//                .apply(DataBaseHelper.findInSet(deptId, "ancestors")));
//        List<SysDept> list = new ArrayList<>();
//        for (SysDept child : children) {
//            SysDept dept = new SysDept();
//            dept.setId(child.getId());
////			dept.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
//            list.add(dept);
//        }
//        if (CollUtil.isNotEmpty(list)) {
//            if (baseMapper.updateBatchById(list)) {
//                list.forEach(dept -> CacheUtils.evict(CacheNames.SYS_DEPT, dept.getId()));
//            }
//        }
//    }

    /**
     * 删除部门管理信息
     *
     * @param deptId 部门ID
     * @return 结果
     */
    @Override
    @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#deptId")
    public boolean delete(String deptId) {
//        if (this.hasChildByDeptId(deptId)) {
//            throw new ServiceException("存在下级部门,不允许删除");
//        }
        if (this.checkDeptExistUser(deptId)) {
            throw new ServiceException("部门存在用户,不允许删除");
        }
        this.checkDeptDataScope(deptId);
        return SqlHelper.retBool(this.baseMapper.deleteById(deptId));
    }
}
